/**
 * 格式化人民币 10000 => 10,000.00
 * @param {*} s 金额  根据金额/倍数 分单位：s/100
 * @param {*} n 保留几位小数
 */
export function moneyFormat(s, n) {
    n = n > 0 && n <= 20 ? n : 2;
    s = parseFloat((s + '').replace(/[^\d/.-]/g, '')).toFixed(n) + '';
    let l = s.split('.')[0].split('').reverse();
    let r = s.split('.')[1];
    let t = '';
    for (let i = 0; i < l.length; i++) {
        let a = i + 1;
        t += l[i] + (a % 3 === 0 && a !== l.length ? ',' : '');
    };
    return t.split('').reverse().join('') + '.' + r;
}

/**
 * 数据分类 -- 饼图专用
 * @param {*} arr 数组
 * @param {*} n 保留几个数组 默认5个  --- 后面的归于其他分类
*/
export function classifyNum(arr, n) {
    n = n || 5
    if(arr instanceof Array && arr.length > 5) {
        arr.sort((a, b) => { 
            return  b.value - a.value
        })

        let other = 0;
        for (let i = 4, len = arr.length; i < len; i++) {
            other += parseFloat(arr[i].value)
        }
        arr.splice(4, arr.length - 4, {name: '其他', value: other.toString()})
        return arr
    } else {
        return arr
    }
}

/**
 * 转换数值表示
 * 999,999,999.99展示为9亿9999万（有亿的情况下省略万之后的数字）
 * 999,999.99展示为99万99（仅有万的情况下展示万后2位）
 * 9,999.99展示为9999.99
 * n 数字
 * f 保留多少位数字
 * isLine 如果是趋势图，需要特殊处理，1-9亿需要保留一位小数
*/
export function numFormat(n, f, isLine) {   
    f = f || 2   
    if(typeof n == 'string' && n.match('%') || n == undefined) {
        return n;
    }      

    let yi = n / 100000000
    let wan = n / 10000

    if(yi > 1 || yi < -1) {
        if(isLine && ((yi > 0 && yi < 9) || (yi > -9 && yi < 0))) {
            return yi.toFixed(1) + '亿'
        } else {            
            return yi.toFixed(f) + '亿'
        }
    }else if (wan > 1 || wan < -1){
        if(isLine && ((wan > 0 && wan < 9) || (wan > -9 && wan < 0))) { 
            return wan.toFixed(1) + '万'
        }else {
            return wan.toFixed(f) + '万'
        }
    } else {
        let len
        let arr  
        arr = (n / 1).toString().split(".")

        if(arr.length > 1) {
            len = arr[1].length
        }

        if(len >= 2) {
            return (n/1).toFixed(f)
        } else {
            return (n/1)
        }
    }
}

/**
 * 合并Object 和 array
 * @param {def} 默认参数
 * @param {obj} 合并的参数
 */
export function merge(def, obj) {
    if (!obj) {
        return def;
    }
    else if (!def) {
        return obj;
    }

    for (let i in def) {
        // 是否是对象---对象则递归
        if (def[i].constructor === Object) {
            if(obj[i] !== undefined) {
                if (obj[i].constructor === Object) {
                    obj[i] = merge(def[i], obj[i])
                }
            } else {
                obj[i] = def[i]
            }  
        }
        // 是否是数组---数组里面是否有对象，有则合并    
        else if((def[i] instanceof Array) && def[i].length > 0) {      
            if(obj[i] && (obj[i] instanceof Array)) {   
                if (obj[i].length > 0) {
                    obj[i] = arrayConcat(def[i], obj[i])
                } else {
                    obj[i] = def[i]
                }
            } 
            if(obj[i] === undefined) {
                obj[i] = def[i]
            }
        }
        else
        {   
            if (obj[i] === undefined) {
                obj[i] = def[i]
            }
        }
    }

    function arrayConcat(arr1, arr2) {
        for (let j = 0, len = arr1.length; j < len; j++) {
           if (arr1[j].constructor === Object) {
                if(arr2[j] !== undefined) {
                    if (arr2[j].constructor === Object) {
                        arr2[j] = merge(arr1[j], arr2[j])
                    }
                } else {
                   arr2[j] = arr1[j]
                }  
            }
            // 是否是数组---数组里面是否有对象，有则合并    
            else if((arr1[j] instanceof Array) && arr1[j].length > 0) {      
                if(arr2[j] && (arr2[j] instanceof Array)) {   
                    if (arr2[j].length > 0) {
                        arr2[j] = arrayConcat(arr1[j], arr2[j])
                    } else {
                        arr2[j] = arr1[j]
                    }
                } 
                if(arr2[j] === undefined) {
                    arr2[j] = arr1[j]
                }
            }
            else
            {
                if (arr2[j] === undefined) {
                    arr2[j] = arr1[j]
                }
            }
        }

        return arr2
    }

    return obj
}

// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符， 
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 
Date.prototype.Format = function (fmt) { //author: meizz 
    var o = {
        "M+": this.getMonth() + 1, //月份 
        "d+": this.getDate(), //日 
        "h+": this.getHours(), //小时 
        "m+": this.getMinutes(), //分 
        "s+": this.getSeconds(), //秒 
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
        "S": this.getMilliseconds() //毫秒 
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}
